package com.itheima.controller;

import com.itheima.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

/**
 * @author Tang
 * @date 2023/4/14
 */

/**
 * 优化1：文件的路径可以通过配置文件动态配置
 * 优化2：文件的名称可以通过UUID来随机生成文件名称
 */
@Slf4j
@RestController
@RequestMapping("/common")
public class CommonController {
    @Value("${reggie.upload-path}")
    private String path;

    /**
     * 文件上传
     *
     * @param file
     * @return
     */
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) throws Exception {
        log.info("文件原始名称：" + file.getOriginalFilename());  // 001.jpg
//        /*//1.前端上传过来的文件是一个临时文件，需要保存
//        //2.设置文件保存路径
//        String path = "D:\\img\\a.jpg";
//        //3.保存文件
//        file.transferTo(new File(path));
//
//        //4.返回结果（图片名称）
//        return R.success("a.jpg");*/

        //优化：
        // 1.文件的名称可以通过UUID来随机生成文件名称
        String fileName = UUID.randomUUID().toString();
        // 2，获取文件的后缀
        String originalFilename = file.getOriginalFilename();
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));// .jpg

        // 需要判断文件路径是否存值
        File dir = new File(path);
        if (!dir.exists()) {
           //如果不存在该文件路径，需要创建出来
//           dir.mkdir();  //  只会创建最后一层路径
           dir.mkdirs();  // 会递归的创建文件路径
        }

        // 3.设置文件保存路径
        file.transferTo(new File(path + fileName + suffix)); // D:\img\xxx-xx-xx.jpg

        // 4.返回结果
        return R.success(fileName+suffix);
    }

    /**
     * 文件下载
     * @param name
     * @param response
     */
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) throws Exception {
        //本质：就是想要将服务器文件以流的形式返回到浏览器显示
        FileInputStream fileInputStream = null;
        ServletOutputStream outputStream = null;
        try {
            //1. 获取输入流 InputStream
            fileInputStream = new FileInputStream(path + name);

            //2. 获取输出流 OutputStream
            outputStream = response.getOutputStream();

            //3. 数据读写
            byte[] bytes = new byte[1024*10]; //一次读10kb
            int len = 0;
            while ((len = fileInputStream.read(bytes)) != -1) {
                outputStream.write(bytes,0, len);
                outputStream.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4. 释放资源
            fileInputStream.close();
            outputStream.close();
        }

    }
}
